RESTful的介绍


RESTful规范就是编写API的规范

1. REST原则

  • 网络上的所有事物都被抽象为资源
  • 每个资源都有一个唯一的资源标识符
  • 同一个资源具有多种表现形式(xml,json等)
  • 对资源的各种操作不会改变资源标识符
  • 所有的操作都是无状态的

2. REST风格

  • 资源 -> 网页上能看到的都是资源

  • URI -> 统一资源标识符(同属理解: 身份证号)

  • URL -> 统一资源定位符(同属理解: 身份证上的住址)

  • 统一资源结构:
    • 对资源(数据)的操作,根据HTTP请求方式(即: GET/POST/PUT/PATCH/DELETE)的不同进行不同的操作 -> 通俗理解: CBV中的根据不同的请求方式(即: GET/POST/PUT/PATCH/DELETE)调用不同的处理请求的方法
    • 遵循HTTP请求方式的语义(即: 不要在处理GET请求方法中添加数据)

  • 前后端传输的是资源的表述

  • 前后端展现的是资源的状态

3. RESTful架构

  • 凡是遵循REST风格实现的前后端交互都叫RESTful架构

  • 每一个URI代表一种资源;
  • 客户端和服务器之间,传递这种资源的某种表现层;
  • 客户端通过HTTP请求,对服务器端资源进行操作,实现"表现层状态转化"。

4. 在 RESTful 中常用的请求方式

  • GET -> 查询数据时使用
  • POST -> 添加数据时使用
  • PUT -> 修改数据时使用(全部修改)
  • PATCH -> 修改数据时使用(局部修改)
  • DELETE -> 删除数据时使用

5. 在 RESTful 中常用的状态码

  • 状态码范围

    • 1xx -> 信息,请求收到,继续处理。范围保留用于底层HTTP的东西,你很可能永远也用不到。
    • 2xx -> 成功,行为被成功地接受、理解和采纳
    • 3xx -> 重定向,为了完成请求,必须进一步执行的动作
    • 4xx -> 客户端错误,请求包含语法错误或者请求无法实现。范围保留用于响应客户端做出的错误,例如。他们提供不良数据或要求不存在的东西。这些请求应该是幂等的,而不是更改服务器的状态。
    • 5xx -> 范围的状态码是保留给服务器端错误用的。这些错误常常是从底层的函数抛出来的,甚至开发人员也通常没法处理,发送这类状态码的目的以确保客户端获得某种响应。当收到5xx响应时,客户端不可能知道服务器的状态,所以这类状态码是要尽可能的避免。

  • 具体状态码

    • 200 -> OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)
    • 201 -> CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功
    • 202 -> Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    • 204 -> NO CONTENT - [DELETE]:用户删除数据成功
    • 301 -> 临时重定向
    • 302 -> 永久重定向
    • 304–> 没有变化,客户端可以使用缓存数据
    • 400 -> INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,确切的错误应该在error payload中描述,例如:“JSON 不合法 ”
    • 401 -> Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)
    • 403 -> Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的
    • 404 -> NOT FOUND - [*]:未找到,指定的资源不存在
    • 406 -> Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)
    • 410 -> Gone -[GET]:用户请求的资源被永久删除,且不会再得到的
    • 422 -> Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误,只有服务器不能处理实体时使用,比如图像不能被格式化,或者重要字段丢失。
    • 500 -> INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功 -> 代码写错了
    • 502 -> 网关错误
    • 503 -> Service Unavailable
    • 504 -> 网关超时

6. 使用和没有使用RESTfu架构的区别

  • 在RESTful之前我们所定义的URL -> 一个操作就是一个接口

http://127.0.0.1/book/ -> 查看所有书籍
http://127.0.0.1/book/addbook -> 添加书籍
http://127.0.0.1/book/editbook/(\d+) -> 修改书籍
http://127.0.0.1/book/deletebook/(\d+) -> 删除数据

  • 使用RESTful后 -> 统一资源结构: 根据HTTP请求方式(即: GET/POST/PUT/PATCH/DELETE)的不同进行不同的操作 -> 一个接口多个操作

http://127.0.0.1/book/ -> GET请求 查看所有数据
                       -> POST请求 添加书籍

http://127.0.0.1/book/(\d+) -> GET请求 查看指定的书籍
                            -> PUT/PATCH请求 修改书籍
                            -> DELETE请求 删除书籍

RESTful架构规范


1. 核心思想

  • 面向资源编程

  • 统一资源结构:

    • 对资源(数据)的操作,根据HTTP请求方式(即: GET/POST/PUT/PATCH/DELETE)的不同进行不同的操作 -> 通俗理解: CBV中的根据不同的请求方式(即: GET/POST/PUT/PATCH/DELETE)调用不同的处理请求的方法
    • 遵循HTTP请求方式的语义(即: 不要在处理GET请求方法中添加数据)

2.url规范

  • url结尾不应该包含"/"

这是作为URL路径中处理中最重要的规则之一,正斜杠(/)不会增加语义值,且可能导致混淆。REST API不允许一个尾部的斜杠,不应该将它们包含在提供给客户端的链接的结尾处。

许多Web组件和框架将平等对待以下两个URI:
    http://api.canvas.com/shapes/
    http://api.canvas.com/shapes

但是,实际上URI中的每个字符都会计入资源的唯一身份的识别中。
两个不同的URI映射到两个不同的资源。如果URI不同,那么资源也是如此,反之亦然。因此,REST API必须生成和传递精确的URI,不能容忍任何的客户端尝试不精确的资源定位。
有些API碰到这种情况,可能设计为让客户端重定向到相应没有尾斜杠的URI(也有可能会返回301 - 用来资源重定向)。

  • 在url中尽量使用名词,不要使用动词

不要使用 /book/addbook/,而是使用 /book/ 然后通过请求方式的不同调用不同的处理请求的方法,即: 在RESTful规范里不要使用之前定义url的方法

  • 避免层级过深的URI

/ 在URI中表示层级,用于按实体关联关系进行对象导航,一般跟进id导航; 过深的导航容易导致url膨胀,不易维护,如 GET /zoos/1/areas/3/animals/4,尽量使用查询参数代替路径中的实体导航,如GET /animals?zoo=1&area=3;

  • 体现API版本

https://v2.bootcss.com/
https://bootcss.com/v2

  • 体现是否是API

https://v2.bootcss.com/api

  • 有过滤条件

https://v2.bootcss.com/course?page=1

# 常见的参数

?limit=10 -> 指定返回记录的数量
?offset=10 -> 指定返回记录的开始位置。
?page_number=2&page_size=100 -> 指定第几页,以及每页的记录数。
?sortby=name&order=asc -> 指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1 -> 指定筛选条件参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。

  • 尽量使用https

3. 定义url的规范

http://127.0.0.1/book/ -> GET请求 查看所有数据
                       -> POST请求 添加书籍

http://127.0.0.1/book/(\d+) -> GET请求 查看指定的书籍
                            -> PUT/PATCH请求 修改书籍
                            -> DELETE请求 删除书籍

4. 返回值的规范

  • 携带状态码

  • 返回值

    • get -> 返回查看的所有或者单条数据
    • post -> 返回新增的这条数据
    • put/patch -> 返回更新的这条数据
    • delete -> 返回值为空

  • 携带错误信息

  • 携带超链接(前后端分离时很少使用,使用场景: 分页器)